package agregacja;

import java.util.*;

import uslugi.*;
import util.StanCywilnyEnum;
import util.WyksztalcenieEnum;

import baza.BazaDanych;

public class LokatyGen {

	public static BazaDanych bd;
	
	private Vector<Lokata> lokaty;
	private Vector<LokataKlienta> lokatyKlienta;
	
	// rok , SumaPieniedzy, Bilans
	private SortedMap<Integer, LokataRok> bilanse = new TreeMap<Integer,LokataRok> ();

	// ilosc konkretnych lokat
	private SortedMap<String, Integer> iloscKonkretnychLokat = new TreeMap<String, Integer>();
	
	//ilosc lokat wg wyksztalcenia
	private Map<WyksztalcenieEnum, Integer> wgWyksztalcenia = new HashMap<WyksztalcenieEnum, Integer>();
	
	// ilsc wg stanu cywilnego
	private Map<StanCywilnyEnum, Integer> wgStanuCywilnego = new HashMap<StanCywilnyEnum, Integer>();
	
	public LokatyGen(){
		
		podlaczDoBazy();
		
		
		lokaty = bd.stworzListe("lokata");
		
		ladujNazwyLokat();
		
		lokatyKlienta = bd.stworzListe("lokataKlienta");
		zliczajLokaty();

	
		
	}
	
	private void ladujNazwyLokat(){
		for(Lokata l : lokaty){
			iloscKonkretnychLokat.put(l.getNazwa(), 0);
		}
	}
	
	public Collection<LokataRok> getBilanse(){
		return bilanse.values();
	}
	
	private void zliczajLokaty(){
		
		for(LokataKlienta lk: lokatyKlienta){
			
			Date dataOtwarcia = lk.getDataUtworzenia();
			Calendar calKonto = Calendar.getInstance();
			calKonto.setTime(dataOtwarcia);
			
			int rok = calKonto.get(Calendar.YEAR);
			
			final String nazwa = lk.getLokata().getNazwa();
			
			if(bilanse.containsKey(rok)){
				
				LokataRok lr = bilanse.get(rok);
				lr.aktualizujSume(lk.getKwota());
				lr.dodajJednaLokate();
				
			} else {
				bilanse.put(rok, new LokataRok(rok, (long)lk.getKwota(), 1));
			}
			
	
			iloscKonkretnychLokat.put(nazwa, iloscKonkretnychLokat.get(nazwa) + 1);
		
			
			
			//wg wyksztalcenia
			final WyksztalcenieEnum wkenum = lk.getWlasciciel().getWyksztalcenie();
			if(wgWyksztalcenia.containsKey(wkenum)){			
				wgWyksztalcenia.put(wkenum, wgWyksztalcenia.get(wkenum) + 1);			
			}else {		
				wgWyksztalcenia.put(wkenum, 1);		
			}
			
			
			//wg stanu cywilnego
			final StanCywilnyEnum sce = lk.getWlasciciel().getStanCywilny();
			if(wgStanuCywilnego.containsKey(sce)){			
				wgStanuCywilnego.put(sce, wgStanuCywilnego.get(sce) + 1);			
			}else {		
				wgStanuCywilnego.put(sce, 1);		
			}
			
			
			
			
			
		}
	}
	
	
	
	private static void podlaczDoBazy(){
		
		bd = new BazaDanych();
		bd.stworzListe("klient");
		
		
	}
	
	public void wyswietlIloscKonkretnychLokat(){
		
		for(Map.Entry em: iloscKonkretnychLokat.entrySet()){
			
			System.out.println(em.getKey() + ": " + em.getValue());
			
		}
		
	}
	
	public void wyswietlWgWyksztalcenia(){
		
		System.out.println("");
		System.out.println("ILOSC Lokat WG WYKSZTALCENIA");
		for(Map.Entry<WyksztalcenieEnum, Integer> em: wgWyksztalcenia.entrySet()){
			
			System.out.println(em.getKey().getNazwa() + "= " + em.getValue());
			
		}
	}
	
	
	public void wyswietlWgSC(){
		
		System.out.println("");
		System.out.println("ILOSC Lokat WG Stanu cywilnego");
		for(Map.Entry<StanCywilnyEnum, Integer> em: wgStanuCywilnego.entrySet()){
			
			System.out.println(em.getKey().getNazwa() + "= " + em.getValue());
			
		}
	}
	
	public Map<WyksztalcenieEnum, Integer> getWgWyksztalcenia() {
		return wgWyksztalcenia;
	}

	public Map<StanCywilnyEnum, Integer> getWgStanuCywilnego() {
		return wgStanuCywilnego;
	}

	public SortedMap<String, Integer> getIloscKonkretnychLokat() {
		return iloscKonkretnychLokat;
	}

	public static void main (String [] args){
		
		LokatyGen sg = new LokatyGen();
		
		Collection<LokataRok> coll = sg.getBilanse();
		
		for(LokataRok lr: coll){
			System.out.println(lr);
		}
		
		
		sg.wyswietlIloscKonkretnychLokat();
		
		sg.wyswietlWgWyksztalcenia();
		
		sg.wyswietlWgSC();
	}
	
}
